package XML;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串通配符比较类
 * 
 * @author 紫夜
 * 
 */
public class Like {
	/**
	 * 模拟SQL的通配符条件判断。 ? % _ [abc1-9] 注意 %_ 是错误个通配字符串
	 * 
	 * @param format
	 *            格式字符串 如：邮箱：%@%_
	 * @param value
	 *            被判断的值 yiyongpeng@tom.com<br>
	 *            如过null则返回false;
	 * @return 是否匹配
	 */
	public static boolean like(String format, String value) {
		if (value == null)
			return false;
		// return format.endsWith(value);
		boolean k = false;// 是否范围通配
		ArrayList<String> als = new ArrayList<String>();
		/**
		 * 被通配的字符串值
		 */
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < format.length(); i++) {
			char ch = format.charAt(i);
			if (k && ch != ']')
				sb.append(ch);// 范围字符截取
			else
				switch (ch) {
				case '[':
					if (sb.length() > 0) {
						als.add(sb.toString());
						sb.setLength(0);
					}
					k = true;
					break;
				case ']':
					k = false;
					// System.out.println("范围通配符:"+sb);
					if (sb.length() > 0) {
						als.add("[" + sb + "]");
						sb.setLength(0);
					}
					break;
				case '%':
					if (sb.length() > 0) {
//						System.out.println(sb.toString());
						als.add(sb.toString());
						// if(!value.startsWith(sb.toString()))return false;
						sb.setLength(0);
					}
					als.add("%");
					break;
				case '_':
					if (sb.length() > 0) {
//						System.out.println(sb.toString());
						als.add(sb.toString());
						// if(!value.startsWith(sb.toString()))return false;
						sb.setLength(0);
					}
					als.add("_");
					break;
				default:
					sb.append(ch);
				}
		}
		if (sb.length() > 0)
			als.add(sb.toString());
		/* [qq, %, dd, _, dd, %] "qq%dd_dd%","qq dd ddssss" */
		// System.out.println(als);
		sb.replace(0, sb.length(), value);
		while (als.size() > 0) {
			// if(sb.length()==0)return false;//没有待通配的字符串，但还有通配字符，返回假
			String str = als.get(0);
			// System.out.println("!~!" + str);
			if (str.charAt(0) == '[' && str.charAt(str.length() - 1) == ']') {
				str = str.substring(1, str.length() - 1);
				// 取出待通配字符串第一个字符
				char ch = sb.charAt(0);
				int i = 0;
				sb.delete(0, 1);
				for (i = 0; i < str.length(); i++) {// [abs1-9z]
					char r = str.charAt(i);
					if (r == '-' && i != 0 && i != str.length() - 1) {// 在中间则进行范围比较
						if (str.charAt(i - 1) < ch && ch < str.charAt(i + 1)) {
							break;
						}
					} else if (r == ch) {
						break;
					}
				}
				if (i == str.length())
					return false;
				als.remove(0);
			} else if (str.equals("%")) {
				// System.out.println(als.toString()+sb);
				if (als.size() > 1) {
					str = als.get(1);
					int kl = sb.indexOf(str);
					// System.out.println("!%!" + sb);
					if (kl == -1)
						return false;
					sb.replace(0, kl + str.length(), "");
					als.remove(0);
					als.remove(0);
				} else {
					// System.out.println("通配通过");
					return true;
				}
			} else if (str.equals("_")) {
				als.remove(0);
				sb.replace(0, 1, "");
			} else {
				if (sb.toString().startsWith(str)) {
					sb.replace(0, str.length(), "");
					als.remove(0);
				} else {
//					System.out.println("字符串通配失败：" + str + " -> " + sb);
					return false;
				}
			}
		}
		if (als.size() > 0)
			return false;// 待通配字符串有剩余，返回假
		// System.out.println("通配符: " + format + " = " + value);
		return true;
	}

	/**
	 * 通过正则表达式进行匹配
	 * 
	 * @param regex
	 *            正则表达式字符换
	 * @param str
	 *            欲匹配的字符串
	 * @return 第一次匹配到的开始索引位置
	 */
	public int regexIndex(String regex, String str) {
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		return matcher.find() ? matcher.start() : -1;
	}
}
